package com.reservation.mapper;

import com.reservation.vo.staff.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

@Mapper
@Repository
public interface StaffMapper {

    /**
     * 获取会议室列表
     * @return 会议室列表
     */
    List<MeetingRoomVO> getMeetingRoomList();
    
    /**
     * 获取待审核的取消预约列表
     * 
     * @return 待审核列表VO
     */
    List<WaitAuditItemVO> getWaitAuditList();
    
    /**
     * 更新订单状态为已退款
     * @param id 订单ID
     * @return 影响行数
     */
    int updateBookingStatusToRefunded(@Param("id") Long id);
    
    /**
     * 更新订单状态为取消待确认
     * @param id 订单ID
     * @return 影响行数
     */
    int updateBookingStatusToWaitingConfirm(@Param("id") Long id);
    
    /**
     * 更新取消申请状态为已批准
     * @param bookingId 订单ID
     * @param employeeId 员工ID
     * @param notes 处理备注
     * @return 影响行数
     */
    int updateCancellationRequestToApproved(@Param("bookingId") Long bookingId, 
                                          @Param("employeeId") Long employeeId,
                                          @Param("notes") String notes);
    
    /**
     * 更新订单状态为拒绝取消
     * @param id 订单ID
     * @return 影响行数
     */
    int updateBookingStatusToRejected(@Param("id") Long id);
    
    /**
     * 更新取消申请状态为已拒绝
     * @param bookingId 订单ID
     * @param employeeId 员工ID
     * @param notes 处理备注
     * @return 影响行数
     */
    int updateCancellationRequestToRejected(@Param("bookingId") Long bookingId, 
                                          @Param("employeeId") Long employeeId,
                                          @Param("notes") String notes);
    
    /**
     * 根据订单ID获取取消申请ID
     * @param bookingId 订单ID
     * @return 取消申请ID
     */
    Long getCancellationRequestByBookingId(@Param("bookingId") Long bookingId);
    
    /**
     * 获取订单总金额
     * @param id 订单ID
     * @return 订单总金额
     */
    Double getOrderTotalAmount(@Param("id") Long id);
    
    /**
     * 获取订单开始时间
     * @param id 订单ID
     * @return 订单开始时间
     */
    LocalDateTime getOrderStartTime(@Param("id") Long id);
    
    /**
     * 获取今日预约列表
     * @return 今日预约列表
     */
    List<TodayReserveItemVO> getTodayReserveList();
    
    /**
     * 更新订单状态为使用中
     * @param id 订单ID
     * @return 影响行数
     */
    int updateBookingStatusToInUse(@Param("id") Long id);
    
    /**
     * 获取使用完毕列表
     * @return 使用完毕列表
     */
    List<UseFinishedItemVO> getUseFinishedList();
    
    /**
     * 更新订单状态为已完成（现在是自动由定时任务完成，但为支持手动设置也可保留此方法）
     * @param id 订单ID
     * @return 影响行数
     */
    int updateBookingStatusToCompleted(@Param("id") Long id);
    
    /**
     * 添加会议室维护记录
     * @param roomId 会议室ID
     * @param startTime 维护开始时间
     * @return 影响行数
     */
    int insertMaintenanceLog(@Param("roomId") Long roomId, @Param("startTime") LocalDateTime startTime);    /**
     * 根据订单ID获取会议室ID
     * @param id 订单ID
     * @return 会议室ID
     */
    Long getRoomIdByBookingId(@Param("id") Long id);
    
    /**
     * 获取维护中的会议室列表
     * @return 维护中的会议室列表
     */
    List<MaintenanceRoomVO> getMaintenanceList();
      /**
     * 结束会议室维护
     * @param roomId 会议室ID
     * @return 影响行数
     */
    int finishMaintenance(@Param("roomId") Long roomId);
}
